package com.boot.ys.mybatisplus.script;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

/**
 * 把一个文件夹里面 子文件夹 下面的图片，随机抽10张，放到另外一个输出文件夹里面
 *
 * @author: 杨升
 * @date: 2024-08-10 20:45
 * @Version 1.0
 */

public class RandomImageCopier {

    // 支持的图像格式
    private static final String[] SUPPORTED_EXTENSIONS = {".jpg", ".jpeg", ".png", ".gif", ".bmp"};

    public static void main(String[] args) {
        // 输入文件夹
        String inputDirPath = "C:\\Users\\Acer\\Desktop\\压缩";
        // 输出文件夹
        String outputDirPath = "C:\\Users\\Acer\\Desktop\\输出";

        copyRandomImagesFromDirectory(inputDirPath, outputDirPath);
    }

    public static void copyRandomImagesFromDirectory(String inputDirPath, String outputDirPath) {
        File inputDir = new File(inputDirPath);
        File outputDir = new File(outputDirPath);

        if (!inputDir.isDirectory()) {
            System.out.println("输入路径不是一个目录。");
            return;
        }

        if (!outputDir.exists()) {
            outputDir.mkdirs(); // 创建输出目录
        }

        // 处理最外层的目录
        File[] subDirs = inputDir.listFiles(File::isDirectory);
        if (subDirs == null) {
            System.out.println("在输入目录中没有找到子目录。");
            return;
        }

        for (File subDir : subDirs) {
            // 在输出目录中创建对应的子目录
            File outputSubDir = new File(outputDir, subDir.getName());
            if (!outputSubDir.exists()) {
                outputSubDir.mkdirs();
            }

            List<File> imageFiles = getImageFilesFromDirectory(subDir);
            if (!imageFiles.isEmpty()) {
                // 随机抽取最多 10 张图片
                List<File> selectedFiles = getRandomFiles(imageFiles, 10);
                // 复制图片到对应的输出子目录
                copyFilesToDirectory(selectedFiles, outputSubDir);
            }
        }
    }

    private static List<File> getImageFilesFromDirectory(File dir) {
        List<File> imageFiles = new ArrayList<>();
        File[] files = dir.listFiles();
        if (files == null) {
            System.out.println("无法读取目录中的文件。");
            return imageFiles;
        }

        for (File file : files) {
            if (file.isFile() && isSupportedImageFormat(file.getName())) {
                imageFiles.add(file);
            }
        }
        return imageFiles;
    }

    private static List<File> getRandomFiles(List<File> files, int maxCount) {
        Collections.shuffle(files, new Random());
        return files.size() > maxCount ? files.subList(0, maxCount) : files;
    }

    private static void copyFilesToDirectory(List<File> files, File outputDir) {
        for (File file : files) {
            try {
                File outputFile = new File(outputDir, file.getName());
                Files.copy(file.toPath(), outputFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
                System.out.println("已复制 " + file.getName() + " 到 " + outputFile.getPath());
            } catch (IOException e) {
                System.err.println("复制 " + file.getName() + " 失败: " + e.getMessage());
            }
        }
    }

    // 检查文件扩展名是否是支持的图像格式
    private static boolean isSupportedImageFormat(String fileName) {
        for (String ext : SUPPORTED_EXTENSIONS) {
            if (fileName.toLowerCase().endsWith(ext)) {
                return true;
            }
        }
        return false;
    }
}
